package cn.wgoodq.controller;

import cn.wgoodq.domain.Result;
import cn.wgoodq.domain.propDemo.RandomObject;
import cn.wgoodq.utils.ResultUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>展示Spring Boot中Controller不同的实现方式</p>
 * Created by kyou on 2017/4/11.
 */
@RestController//该注解不需要视图，直接返回结果给浏览器。
public class DemoController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private final RandomObject randomObject;

    @Autowired
    public DemoController(RandomObject randomObject) {
        this.randomObject = randomObject;
    }

    /**
     * rest风格路由
     *
     * @return 返回0-10之间的数字。
     */
    @GetMapping("/method1")
    Result method1() {
        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return ResultUtil.success(randomObject.getInt10());
    }

    /**
     * 一个参数
     *
     * @param param 传入参数
     * @return 返回传入参数
     */
    @PostMapping("/method2/{param}")
    Result method2(@PathVariable("param") String param) {
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return ResultUtil.success("Param: " + param);
    }

    /**
     * 两个参数
     *
     * @param param  第一个传入参数
     * @param param2 第二个传入参数
     * @return 将传入参数返回
     */
    @PostMapping("/method2/{param}/{param2}")
    Result method2(@PathVariable("param") String param, @PathVariable("param2") String param2) {
        return ResultUtil.success("Param: " + param + "; param2: " + param2);
    }

    /**
     * 以param=123的形式传递参数，并设置参数的默认值。
     *
     * @param param 传入参数
     * @return 将传入参数返回
     */
    @RequestMapping(value = "method3", method = RequestMethod.POST)
    Result method3(@RequestParam(value = "param", required = false, defaultValue = "defaultValue") String param) {
        return ResultUtil.success("Param: " + param);
    }

    @GetMapping("/errorTest")
    void errorTest() throws Exception {
        throw new Exception("Exception Test.");
    }
}
